def StdC : StandardSpec<"stdc"> {

  NamedType StructTmType = NamedType<"struct tm">;
  PtrType StructTmPtr = PtrType<StructTmType>;
  PtrType TimeTTypePtr = PtrType<TimeTType>;
  NamedType ClockT = NamedType<"clock_t">;

  NamedType DivTType = NamedType<"div_t">;
  NamedType LDivTType = NamedType<"ldiv_t">;
  NamedType LLDivTType = NamedType<"lldiv_t">;

  NamedType JmpBuf = NamedType<"jmp_buf">;

  NamedType TssTType = NamedType<"tss_t">;
  PtrType TssTPtr = PtrType<TssTType>;
  NamedType TssDtorTType = NamedType<"tss_dtor_t">;

  HeaderSpec Assert = HeaderSpec<
      "assert.h",
      [
          Macro<"static_assert">,
          Macro<"assert">,
      ],
      [], // Types
      [], // Enumerations
      []
  >;

  HeaderSpec CType = HeaderSpec<
      "ctype.h",
      [], // Macros
      [], // Types
      [], // Enumerations
      [
          FunctionSpec<
              "isalnum",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isalpha",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isblank",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "iscntrl",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isdigit",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isgraph",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "islower",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isprint",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "ispunct",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isspace",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isupper",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "isxdigit",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "tolower",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "toupper",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
      ]
  >;

  NamedType FEnvT = NamedType<"fenv_t">;
  PtrType FEnvTPtr = PtrType<FEnvT>;
  ConstType ConstFEnvTPtr = ConstType<FEnvTPtr>;
  NamedType FExceptT = NamedType<"fexcept_t">;
  PtrType FExceptTPtr = PtrType<FExceptT>;
  ConstType ConstFExceptTPtr = ConstType<FExceptTPtr>;
  HeaderSpec Fenv = HeaderSpec<
      "fenv.h",
      [
          Macro<"FE_DIVBYZERO">,
          Macro<"FE_INEXACT">,
          Macro<"FE_INVALID">,
          Macro<"FE_OVERFLOW">,
          Macro<"FE_UNDERFLOW">,
          Macro<"FE_ALL_EXCEPT">,

          Macro<"FE_DOWNWARD">,
          Macro<"FE_TONEAREST">,
          Macro<"FE_TOWARDZERO">,
          Macro<"FE_UPWARD">,

          Macro<"FE_DFL_ENV">
      ],
      [
          NamedType<"fenv_t">,
          NamedType<"fexcept_t">,
      ], // Types
      [], // Enumerations
      [
          FunctionSpec<
              "feclearexcept",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fetestexcept",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "feraiseexcept",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fesetround",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fegetround",
              RetValSpec<IntType>,
              []
          >,
          FunctionSpec<
              "fegetenv",
              RetValSpec<IntType>,
              [ArgSpec<FEnvTPtr>]
          >,
          FunctionSpec<
              "fesetenv",
              RetValSpec<IntType>,
              [ArgSpec<ConstFEnvTPtr>]
          >,
          FunctionSpec<
              "fegetexceptflag",
              RetValSpec<IntType>,
              [ArgSpec<FExceptTPtr>, ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fesetexceptflag",
              RetValSpec<IntType>,
              [ArgSpec<ConstFExceptTPtr>, ArgSpec<IntType>]
          >,
          FunctionSpec<
              "feholdexcept",
              RetValSpec<IntType>,
              [ArgSpec<FEnvTPtr>]
          >,
          FunctionSpec<
              "feupdateenv",
              RetValSpec<IntType>,
              [ArgSpec<ConstFEnvTPtr>]
          >,
      ]
  >;

  HeaderSpec String = HeaderSpec<
      "string.h",
      [
          Macro<"NULL">,
      ],
      [
          SizeTType,
      ],
      [], // Enumerations
      [
          FunctionSpec<
              "memcpy",
              RetValSpec<VoidPtr>,
              [ArgSpec<VoidRestrictedPtr>,
               ArgSpec<ConstVoidRestrictedPtr>,
               ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "memmove",
              RetValSpec<VoidPtr>,
              [ArgSpec<VoidPtr>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "memcmp",
              RetValSpec<IntType>,
              [ArgSpec<ConstVoidPtr>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "memchr",
              RetValSpec<VoidPtr>,
              [ArgSpec<ConstVoidPtr>, ArgSpec<IntType>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "memset",
              RetValSpec<VoidPtr>,
              [ArgSpec<VoidPtr>, ArgSpec<IntType>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strcpy",
              RetValSpec<CharPtr>,
              [ArgSpec<CharRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>]
          >,
          FunctionSpec<
              "strncpy",
              RetValSpec<CharPtr>,
              [ArgSpec<CharRestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strcat",
              RetValSpec<CharPtr>,
              [ArgSpec<CharRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>]
          >,
          FunctionSpec<
              "strncat",
              RetValSpec<CharPtr>,
              [ArgSpec<CharPtr>, ArgSpec<ConstCharPtr>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strcmp",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strcoll",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strncmp",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strxfrm",
              RetValSpec<SizeTType>,
              [ArgSpec<CharRestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strchr",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>, ArgSpec<IntType>]
          >,
          FunctionSpec<
              "strcspn",
              RetValSpec<SizeTType>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strdup",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strndup",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>,ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "strpbrk",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strrchr",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>, ArgSpec<IntType>]
          >,
          FunctionSpec<
              "strspn",
              RetValSpec<SizeTType>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strstr",
              RetValSpec<CharPtr>,
              [ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "strtok",
              RetValSpec<CharPtr>,
              [ArgSpec<CharRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>]
          >,
          FunctionSpec<
              "strerror",
              RetValSpec<CharPtr>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "strlen",
              RetValSpec<SizeTType>,
              [ArgSpec<ConstCharPtr>]
          >,
      ]
  >;

  HeaderSpec Math = HeaderSpec<
      "math.h",
      [
          Macro<"MATH_ERRNO">,
          Macro<"MATH_ERREXCEPT">,
          Macro<"math_errhandling">,

          Macro<"HUGE_VAL">,
          Macro<"INFINITY">,
          Macro<"NAN">,

          Macro<"FP_ILOGB0">,
          Macro<"FP_ILOGBNAN">,

          Macro<"isfinite">,
          Macro<"isinf">,
          Macro<"isnan">,
      ],
      [
          NamedType<"float_t">,
          NamedType<"double_t">,
      ],
      [], // Enumerations
      [
          FunctionSpec<"copysign", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"copysignf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"copysignl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"ceil", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"ceilf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"ceill", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"fabs", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"fabsf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"fabsl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"fdim", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"fdimf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"fdiml", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"floor", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"floorf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"floorl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"fmin", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"fminf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"fminl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"fmax", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"fmaxf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"fmaxl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"fma", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"fmaf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>, ArgSpec<FloatType>]>,

          FunctionSpec<"fmod", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,

          FunctionSpec<"fmodf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,

          FunctionSpec<"frexp", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<IntPtr>]>,
          FunctionSpec<"frexpf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<IntPtr>]>,
          FunctionSpec<"frexpl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<IntPtr>]>,

          FunctionSpec<"hypot", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"hypotf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,

          FunctionSpec<"ilogb", RetValSpec<IntType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"ilogbf", RetValSpec<IntType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"ilogbl", RetValSpec<IntType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"ldexp", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<IntType>]>,
          FunctionSpec<"ldexpf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<IntType>]>,
          FunctionSpec<"ldexpl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<IntType>]>,

          FunctionSpec<"log10", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"log10f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"log1pf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"log2f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"logf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"logb", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"logbf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"logbl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"modf", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoublePtr>]>,
          FunctionSpec<"modff", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatPtr>]>,
          FunctionSpec<"modfl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoublePtr>]>,

          FunctionSpec<"cos", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"cosf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"sin", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"sinf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"tan", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"tanf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"expf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"exp2f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"expm1f", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"remainderf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"remainder", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"remainderl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"remquof", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>, ArgSpec<IntPtr>]>,
          FunctionSpec<"remquo", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>, ArgSpec<IntPtr>]>,
          FunctionSpec<"remquol", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>, ArgSpec<IntPtr>]>,

          FunctionSpec<"round", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"roundf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"roundl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"lround", RetValSpec<LongType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"lroundf", RetValSpec<LongType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"lroundl", RetValSpec<LongType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"llround", RetValSpec<LongLongType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"llroundf", RetValSpec<LongLongType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"llroundl", RetValSpec<LongLongType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"rint", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"rintf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"rintl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"lrint", RetValSpec<LongType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"lrintf", RetValSpec<LongType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"lrintl", RetValSpec<LongType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"llrint", RetValSpec<LongLongType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"llrintf", RetValSpec<LongLongType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"llrintl", RetValSpec<LongLongType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"sqrt", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"sqrtf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"sqrtl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"trunc", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"truncf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"truncl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"nearbyint", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"nearbyintf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"nearbyintl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>]>,

          FunctionSpec<"nextafterf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<FloatType>]>,
          FunctionSpec<"nextafter", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,
          FunctionSpec<"nextafterl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<LongDoubleType>]>,

          FunctionSpec<"pow", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<DoubleType>]>,

          FunctionSpec<"coshf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"sinhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"tanhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"acosf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"asinf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"asin", RetValSpec<DoubleType>, [ArgSpec<DoubleType>]>,
          FunctionSpec<"atanf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"acoshf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"asinhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,
          FunctionSpec<"atanhf", RetValSpec<FloatType>, [ArgSpec<FloatType>]>,

          FunctionSpec<"scalbn", RetValSpec<DoubleType>, [ArgSpec<DoubleType>, ArgSpec<IntType>]>,
          FunctionSpec<"scalbnf", RetValSpec<FloatType>, [ArgSpec<FloatType>, ArgSpec<IntType>]>,
          FunctionSpec<"scalbnl", RetValSpec<LongDoubleType>, [ArgSpec<LongDoubleType>, ArgSpec<IntType>]>,
      ]
  >;

  HeaderSpec StdIO = HeaderSpec<
      "stdio.h",
      [
          Macro<"stdin">,
          Macro<"stderr">,
          Macro<"stdout">,
          Macro<"_IOFBF">,
          Macro<"_IOLBF">,
          Macro<"_IONBF">,
          Macro<"EOF">,
      ], // Macros
      [ // Types
          SizeTType,
          FILE,
      ],
      [], // Enumerations
      [
          FunctionSpec<
              "clearerr",
              RetValSpec<VoidType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "fclose",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "feof",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "ferror",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "fgetc",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "fgets",
              RetValSpec<CharPtr>,
              [
                ArgSpec<CharRestrictedPtr>,
                ArgSpec<IntType>,
                ArgSpec<FILERestrictedPtr>,
              ]
          >,
          FunctionSpec<
              "fflush",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "fopen",
              RetValSpec<FILEPtr>,
              [ArgSpec<ConstCharPtr>,
               ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "fputc",
              RetValSpec<IntType>,
              [ArgSpec<IntType>,
               ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "ftell",
              RetValSpec<LongType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "getc",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "putc",
              RetValSpec<IntType>,
              [ArgSpec<IntType>,
               ArgSpec<FILEPtr>]
          >,
          FunctionSpec<
              "putchar",
              RetValSpec<IntType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fputs",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<FILERestrictedPtr>]
          >,
          FunctionSpec<
              "puts",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharRestrictedPtr>]
          >,
          FunctionSpec<
              "fread",
              RetValSpec<SizeTType>,
              [ArgSpec<VoidRestrictedPtr>,
               ArgSpec<SizeTType>,
               ArgSpec<SizeTType>,
               ArgSpec<FILERestrictedPtr>]
          >,
          FunctionSpec<
              "fseek",
              RetValSpec<IntType>,
              [ArgSpec<FILEPtr>,
               ArgSpec<LongType>,
               ArgSpec<IntType>]
          >,
          FunctionSpec<
              "fwrite",
              RetValSpec<SizeTType>,
              [ArgSpec<ConstVoidRestrictedPtr>,
               ArgSpec<SizeTType>,
               ArgSpec<SizeTType>,
               ArgSpec<FILERestrictedPtr>]
          >,
          FunctionSpec<
              "remove",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharPtr>]
          >,
          FunctionSpec<
              "setbuf",
              RetValSpec<VoidType>,
              [ArgSpec<FILERestrictedPtr>, ArgSpec<CharRestrictedPtr>]
          >,
          FunctionSpec<
              "setvbuf",
              RetValSpec<IntType>,
              [ArgSpec<FILERestrictedPtr>, ArgSpec<CharRestrictedPtr>, ArgSpec<IntType>, ArgSpec<SizeTType>]
          >,
          FunctionSpec<
              "sscanf",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "scanf",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "fscanf",
              RetValSpec<IntType>,
              [ArgSpec<FILERestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "sprintf",
              RetValSpec<IntType>,
              [ArgSpec<CharRestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "snprintf",
              RetValSpec<IntType>,
              [ArgSpec<CharRestrictedPtr>,
               ArgSpec<SizeTType>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "printf",
              RetValSpec<IntType>,
              [ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "fprintf",
              RetValSpec<IntType>,
              [ArgSpec<FILERestrictedPtr>,
               ArgSpec<ConstCharRestrictedPtr>,
               ArgSpec<VarArgType>]
          >,
          FunctionSpec<
              "ungetc",
              RetValSpec<IntType>,
              [ArgSpec<IntType>, ArgSpec<FILEPtr>]
          >,
      ],
      [
          ObjectSpec<
              "stdin",
              "FILE *"
          >,
          ObjectSpec<
              "stdout",
              "FILE *"
          >,
          ObjectSpec<
              "stderr",
              "FILE *"
          >,
      ]
  >;

  HeaderSpec StdLib = HeaderSpec<
      "stdlib.h",
      [], // Macros
      [
          DivTType,
          LDivTType,
          LLDivTType,
          SizeTType,
          BSearchCompareT,
          QSortCompareT,
          AtexitHandlerT,
      ], // Types
      [], // Enumerations
      [
          FunctionSpec<"abort", RetValSpec<NoReturn>, [ArgSpec<VoidType>]>,

          FunctionSpec<"bsearch", RetValSpec<VoidPtr>, [ArgSpec<ConstVoidPtr>, ArgSpec<ConstVoidPtr>, ArgSpec<SizeTType>, ArgSpec<SizeTType>, ArgSpec<BSearchCompareT>]>,

          FunctionSpec<"abs", RetValSpec<IntType>, [ArgSpec<IntType>]>,
          FunctionSpec<"labs", RetValSpec<LongType>, [ArgSpec<LongType>]>,
          FunctionSpec<"llabs", RetValSpec<LongLongType>, [ArgSpec<LongLongType>]>,

          FunctionSpec<"atof", RetValSpec<DoubleType>, [ArgSpec<ConstCharRestrictedPtr>]>,
          FunctionSpec<"atoi", RetValSpec<IntType>, [ArgSpec<ConstCharPtr>]>,
          FunctionSpec<"atol", RetValSpec<LongType>, [ArgSpec<ConstCharPtr>]>,
          FunctionSpec<"atoll", RetValSpec<LongLongType>, [ArgSpec<ConstCharPtr>]>,

          FunctionSpec<"div", RetValSpec<DivTType>, [ArgSpec<IntType>, ArgSpec<IntType>]>,
          FunctionSpec<"ldiv", RetValSpec<LDivTType>, [ArgSpec<LongType>, ArgSpec<LongType>]>,
          FunctionSpec<"lldiv", RetValSpec<LLDivTType>, [ArgSpec<LongLongType>, ArgSpec<LongLongType>]>,

          FunctionSpec<"qsort", RetValSpec<VoidType>, [ArgSpec<VoidPtr>, ArgSpec<SizeTType>, ArgSpec<SizeTType>, ArgSpec<QSortCompareT>]>,

          FunctionSpec<"rand", RetValSpec<IntType>, [ArgSpec<VoidType>]>,
          FunctionSpec<"srand", RetValSpec<VoidType>, [ArgSpec<UnsignedIntType>]>,

          FunctionSpec<"strtof", RetValSpec<FloatType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>]>,
          FunctionSpec<"strtod", RetValSpec<DoubleType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>]>,
          FunctionSpec<"strtold", RetValSpec<LongDoubleType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>]>,
          FunctionSpec<"strtol", RetValSpec<LongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
          FunctionSpec<"strtoll", RetValSpec<LongLongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
          FunctionSpec<"strtoul", RetValSpec<UnsignedLongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
          FunctionSpec<"strtoull", RetValSpec<UnsignedLongLongType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,

          FunctionSpec<"malloc", RetValSpec<VoidPtr>, [ArgSpec<SizeTType>]>,
          FunctionSpec<"calloc", RetValSpec<VoidPtr>, [ArgSpec<SizeTType>, ArgSpec<SizeTType>]>,
          FunctionSpec<"realloc", RetValSpec<VoidPtr>, [ArgSpec<VoidPtr>, ArgSpec<SizeTType>]>,
          FunctionSpec<"aligned_alloc", RetValSpec<VoidPtr>, [ArgSpec<SizeTType>, ArgSpec<SizeTType>]>,
          FunctionSpec<"free", RetValSpec<VoidType>, [ArgSpec<VoidPtr>]>,

          FunctionSpec<"_Exit", RetValSpec<NoReturn>, [ArgSpec<IntType>]>,
          FunctionSpec<"exit", RetValSpec<NoReturn>, [ArgSpec<IntType>]>,
          FunctionSpec<"atexit", RetValSpec<IntType>, [ArgSpec<AtexitHandlerT>]>,
      ]
  >;

  NamedType IMaxDivTType = NamedType<"imaxdiv_t">;

  HeaderSpec IntTypes = HeaderSpec<
      "inttypes.h",
      [], // Macros
      [
        IMaxDivTType,
      ], // Types
      [], // Enumerations
      [
          FunctionSpec<"imaxabs", RetValSpec<IntMaxTType>, [ArgSpec<IntMaxTType>]>,
          FunctionSpec<"imaxdiv", RetValSpec<IMaxDivTType>, [ArgSpec<IntMaxTType>, ArgSpec<IntMaxTType>]>,
          FunctionSpec<"strtoimax", RetValSpec<IntMaxTType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
          FunctionSpec<"strtoumax", RetValSpec<UIntMaxTType>, [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<CharRestrictedPtrPtr>, ArgSpec<IntType>]>,
      ]
  >;

  HeaderSpec Errno = HeaderSpec<
      "errno.h",
      [
        Macro<"errno">,
        Macro<"EDOM">,
        Macro<"EILSEQ">,
        Macro<"ERANGE">,
      ]
  >;

  NamedType SigAtomicT = NamedType<"sig_atomic_t">;
  HeaderSpec Signal = HeaderSpec<
      "signal.h",
      [
        Macro<"SIG_BLOCK">,
        Macro<"SIG_UNBLOCK">,
        Macro<"SIG_SETMASK">,

        Macro<"SIGABRT">,
        Macro<"SIGFPE">,
        Macro<"SIGILL">,
        Macro<"SIGINT">,
        Macro<"SIGSEGV">,
        Macro<"SIGTERM">
      ],
      [
        SizeTType,
        SigAtomicT,
        SigHandlerT,
      ],
      [], // Enumerations
      [
        FunctionSpec<"raise", RetValSpec<IntType>, [ArgSpec<IntType>]>,
        FunctionSpec<
          "signal",
          RetValSpec<SigHandlerT>,
          [ArgSpec<IntType>, ArgSpec<SigHandlerT>]
        >,
      ]
  >;

  HeaderSpec Threads = HeaderSpec<
      "threads.h",
      [
          Macro<"ONCE_FLAG_INIT">,
      ],
      [
          OnceFlagType,
          CallOnceFuncType,
          CndTType,
          MtxTType,
          ThrdStartTType,
          ThrdTType,
          TssTType,
          TssDtorTType,
      ],
      [
          EnumeratedNameValue<"mtx_plain">,
          EnumeratedNameValue<"mtx_recursive">,
          EnumeratedNameValue<"mtx_timed">,
          EnumeratedNameValue<"thrd_timedout">,
          EnumeratedNameValue<"thrd_success">,
          EnumeratedNameValue<"thrd_busy">,
          EnumeratedNameValue<"thrd_error">,
          EnumeratedNameValue<"thrd_nomem">,
      ],
      [
          FunctionSpec<
              "call_once",
              RetValSpec<VoidType>,
              [
                  ArgSpec<OnceFlagTypePtr>,
                  ArgSpec<CallOnceFuncType>,
              ]
          >,
          FunctionSpec<
              "cnd_broadcast",
              RetValSpec<IntType>,
              [
                  ArgSpec<CndTTypePtr>,
              ]
          >,
          FunctionSpec<
              "cnd_destroy",
              RetValSpec<VoidType>,
              [
                  ArgSpec<CndTTypePtr>,
              ]
          >,
          FunctionSpec<
              "cnd_init",
              RetValSpec<IntType>,
              [
                  ArgSpec<CndTTypePtr>,
              ]
          >,
          FunctionSpec<
              "cnd_signal",
              RetValSpec<IntType>,
              [
                  ArgSpec<CndTTypePtr>,
              ]
          >,
          FunctionSpec<
              "cnd_wait",
              RetValSpec<IntType>,
              [
                  ArgSpec<CndTTypePtr>,
                  ArgSpec<MtxTTypePtr>,
              ]
          >,
          FunctionSpec<
              "mtx_init",
              RetValSpec<IntType>,
              [
                  ArgSpec<MtxTTypePtr>,
                  ArgSpec<IntType>,
              ]
          >,
          FunctionSpec<
              "mtx_destroy",
              RetValSpec<IntType>,
              [
                  ArgSpec<VoidType>,
              ]
          >,
          FunctionSpec<
              "mtx_lock",
              RetValSpec<IntType>,
              [
                  ArgSpec<MtxTTypePtr>,
              ]
          >,
          FunctionSpec<
              "mtx_unlock",
              RetValSpec<IntType>,
              [
                  ArgSpec<MtxTTypePtr>,
              ]
          >,
          FunctionSpec<
              "thrd_create",
              RetValSpec<IntType>,
              [
                  ArgSpec<ThrdTTypePtr>,
                  ArgSpec<ThrdStartTType>,
                  ArgSpec<VoidPtr>,
              ]
          >,
          FunctionSpec<
              "thrd_join",
              RetValSpec<IntType>,
              [
                  ArgSpec<ThrdTType>,
                  ArgSpec<IntPtr>,
              ]
          >,
          FunctionSpec<
              "thrd_detach",
              RetValSpec<IntType>,
              [ArgSpec<ThrdTType>]
          >,
          FunctionSpec<
              "thrd_current",
              RetValSpec<ThrdTType>,
              [ArgSpec<VoidType>]
          >,
          FunctionSpec<
              "thrd_equal",
              RetValSpec<IntType>,
              [ArgSpec<ThrdTType>, ArgSpec<ThrdTType>]
          >,
          FunctionSpec<
              "thrd_exit",
              RetValSpec<VoidType>,
              [ArgSpec<IntType>]
          >,
          FunctionSpec<
              "tss_create",
              RetValSpec<IntType>,
              [ArgSpec<TssTPtr>, ArgSpec<TssDtorTType>]
          >,
          FunctionSpec<
              "tss_delete",
              RetValSpec<IntType>,
              [ArgSpec<TssTType>]
          >,
          FunctionSpec<
              "tss_get",
              RetValSpec<VoidPtr>,
              [ArgSpec<TssTType>]
          >,
          FunctionSpec<
              "tss_set",
              RetValSpec<IntType>,
              [ArgSpec<TssTType>, ArgSpec<VoidPtr>]
          >,
      ]
  >;

  HeaderSpec Time = HeaderSpec<
      "time.h",
      [], // Macros
      [ // Types
         ClockT,
         StructTmType,
         TimeTType,
      ],
      [], // Enumerations
      [
          FunctionSpec<
              "asctime",
              RetValSpec<CharPtr>,
              [ArgSpec<StructTmPtr>]
          >,
          FunctionSpec<
              "asctime_r",
              RetValSpec<CharPtr>,
              [
                  ArgSpec<StructTmPtr>,
                  ArgSpec<CharPtr>,
              ]
          >,
          FunctionSpec<
              "clock",
              RetValSpec<ClockT>,
              [ArgSpec<VoidType>]
          >,
          FunctionSpec<
              "difftime",
              RetValSpec<DoubleType>,
              [
                  ArgSpec<TimeTType>,
                  ArgSpec<TimeTType>,
              ]
          >,
          FunctionSpec<
              "gmtime",
              RetValSpec<StructTmPtr>,
              [ArgSpec<TimeTTypePtr>]
          >,
          FunctionSpec<
              "gmtime_r",
              RetValSpec<StructTmPtr>,
              [
                  ArgSpec<TimeTTypePtr>,
                  ArgSpec<StructTmPtr>,
              ]
          >,
          FunctionSpec<
              "mktime",
              RetValSpec<TimeTType>,
              [ArgSpec<StructTmPtr>]
          >,
          FunctionSpec<
              "time",
              RetValSpec<TimeTType>,
              [ArgSpec<TimeTTypePtr>]
          >,
      ]
  >;

  HeaderSpec SetJmp = HeaderSpec<
      "setjmp.h",
      [], // Macros
      [JmpBuf],
      [], // Enumerations
      [
          FunctionSpec<
              "longjmp",
              RetValSpec<NoReturn>,
              [ArgSpec<JmpBuf>, ArgSpec<IntType>]
          >,
          FunctionSpec<
              "setjmp",
              RetValSpec<IntType>,
              [ArgSpec<JmpBuf>]
          >,
          FunctionSpec<
              "longjmp",
              RetValSpec<VoidType>,
              [ArgSpec<JmpBuf>, ArgSpec<IntType>]
          >,
      ]
  >;

  HeaderSpec WChar = HeaderSpec<
      "wchar.h",
      [ // Macros
        Macro<"WEOF">,
      ], 
      [ //Types
        SizeTType,
        WIntType,
        WCharType,
      ],
      [], // Enumerations
      [
          FunctionSpec<
              "wctob",
              RetValSpec<IntType>,
              [ArgSpec<WIntType>]
          >,
      ]
  >;


  let Headers = [
    Assert,
    CType,
    Errno,
    Fenv,
    Math,
    String,
    StdIO,
    StdLib,
    IntTypes,
    SetJmp,
    Signal,
    Threads,
    Time,
    WChar,
  ];
}
